/*
 * phi
 */

var $id     = function(id)  { return document.getElementById(id); }
var $class  = function(c, i){ i=i||0; return document.getElementsByClassName(c)[i]; }
var $classes= function(c)   { return document.getElementsByClassName(c); }

/**
 * ロード
 */
window.addEventListener("load", function()
{
    // 初期化
    init();
    
    // ファイルリストを更新
    refreshFileList();
}, false);

/**
 * 初期化
 */
var init = function()
{
    var text_area = $id("main-ta");
    var file_list = $id("file-list");
    var file_header = $class("file-header");

    // save
    $id("save").addEventListener("click", function(){
        var file_name = $class("file-name").innerHTML;
        var value = text_area.value;
        // 保存
        file_name = tm.EditorHelper.save(file_name, value);
        // ファイルヘッダを更新
        refreshFileHader(file_name);
        // ファイルリストを更新
        refreshFileList();
    }, false);

    // save as
    $id("save-as").addEventListener("click", function(){
        var value = text_area.value;
        // 保存
        var file_name = tm.EditorHelper.saveAs(value);
        // ファイルヘッダを更新
        refreshFileHader(file_name);
        // ファイルリストを更新
        refreshFileList();
    }, false);
    
    // open
    $id("open").addEventListener("click", function(){
        var file_name = file_list.value;
        text_area.value = tm.EditorHelper.open(file_name);
        // ファイルヘッダを更新
        refreshFileHader(file_name);
    }, false);
    
    // clear
    $id("clear").addEventListener("click", function(){
        text_area.value = "";
    }, false);
    
    // delete
    $id("delete").addEventListener("click", function(){
        var file_name = file_list.value;
        tm.EditorHelper["delete"](file_name);
        // ファイルリストを更新
        refreshFileList();
    }, false);
    
    // rename
    $id("rename").addEventListener("click", function(){
        var file_name = file_list.value;
        tm.EditorHelper.rename(file_name);
        // ファイルリストを更新
        refreshFileList();
    }, false);
    
    // ファイルリストの項目をクリックしたときに open と同じ動作にする
    file_list.addEventListener("dblclick", function(){
        var file_name = file_list.value;
        if (file_name) {
            text_area.value = tm.EditorHelper.open(file_name);
            // ファイルヘッダを更新
            refreshFileHader(file_name);
        }
    }, false);
    
    
    
    // ----------------------------------------------------------------
    
    // ファイルのドラッグ&ドロップと読み込み対応
    document.addEventListener("dragover", cancelEvent, false);
    document.addEventListener("dragenter", cancelEvent, false);
    document.addEventListener("drop", onDropFile, false);
    $id("read").addEventListener("change", onSelectFile, false);
    
    // download
    $id("download").addEventListener("click", function(){
        window.open( "data:application/octet-stream,"+encodeURIComponent(text_area.value) );
    }, false);
    
    
    
    
    // ----------------------------------------------------------------
    
    // import
    $id("import").addEventListener("change", function(e){
        var file = e.target.files[0];
        var reader = new FileReader();
        
        reader.onload = function(e)
        {
            var obj = JSON.parse(e.target.result);
            for (var key in obj) {
                var value = obj[key];
                localStorage.setItem(key, value);
            }
            // ファイルリストを更新
            refreshFileList();
        };
        
        reader.readAsText(file);
    }, false);
    
    // export
    $id("export").addEventListener("click", function(){
        var data = JSON.stringify(localStorage);
        window.open( "data:application/octet-stream,"+data );
    }, false);
    
};

/**
 * ファイルリスト更新
 */
var refreshFileList = function()
{
    var file_list = $id("file-list");
    
    file_list.innerHTML = "";
    
    for (var i=0; i<localStorage.length; ++i) {
        var key = localStorage.key(i);
        if (key[0] == '.') continue ;
        
        var option = document.createElement("option");
        option.setAttribute("value", key);
        option.innerHTML = key;
        file_list.appendChild(option);
    }
};

var cancelEvent = function(e)
{
    if (e.preventDefault) { e.preventDefault(); }
    return false;
};

var onSelectFile = function(e)
{
    var files = e.target.files;
    for (var i=0; i<files.length; ++i) {
        readFile(files[i]);
    }
};

var onDropFile = function(e)
{
    e.preventDefault();
    var files = e.dataTransfer.files;
    for (var i=0; i<files.length; ++i) {
        readFile(files[i]);
    }
};

var readFile = function(file)
{
    var reader = new FileReader();
    
    reader.onload = function(e)
    {
        var name = file.name;
        var data = e.target.result;
        // 保存
        tm.EditorHelper.save(name, data);
        // ファイルリストを更新
        refreshFileList();
    };
    
    reader.readAsText(file);
};

/**
 * ヘッダ更新
 */
var refreshFileHader = function(file_name)
{
    var file_header = $class("file-header");
    var file_name_element = file_header.getElementsByClassName("file-name")[0];
    file_name_element.innerHTML = file_name;
};

var tm = tm || {};

/**
 * Editor ヘルパークラス
 */
tm.EditorHelper = {
    /**
     * 保存
     */
    save: function(file_name, value)
    {
        // Untitled だった場合, 新たな名前を入力させる
        if (file_name == "Untitled") {
            // 名前を入力
            file_name = this.saveAs(value);
        }
        else {
            // 保存
            localStorage.setItem(file_name, value);
        }
        
        return file_name;
    },
    
    /**
     * 別名で保存
     */
    saveAs: function(value)
    {
        // 名前を入力
        var file_name = prompt("file name: ", "");
        
        // 重複チェック
        if (localStorage[file_name]) {
            var result = confirm("すでにそのファイル名のファイルは存在しています. 上書きしてもよろしいでしょうか？");
            if (result===false) return ;
        }
        
        // 保存
        localStorage.setItem(file_name, value);
        
        return file_name;
    },
    
    /**
     * 開く
     */
    open: function(file_name)
    {
        return localStorage.getItem(file_name);
    },
    
    /**
     * 削除
     */
    "delete": function(file_name)
    {
        localStorage.removeItem(file_name);
    },
    
    /**
     * リネーム
     */
    rename: function(file_name)
    {
        // check
        if (!file_name) { alert("ファイルを選択していません!"); return ; }
        
        // input new name
        var new_name = prompt("Now file name: "+file_name+"\nNew file name: ", "");
        
        // check
        if (!new_name) { alert("新しいファイル名が入力されていません!"); return ; }
        if (localStorage[new_name]) { alert("そのファイル名はすでに存在しています!!"); return ; }
        
        // swap
        var value = localStorage.getItem(file_name);
        this["delete"](file_name);
        this["save"](new_name, value);
    }
};

